As packets arrive at network nodes, a technology referred to as network load balancing (NLB) distributes the load between the nodes. In one solution, each packet is received at each node, but only one of the nodes handles the packet based on attributes of the TCP connection (protocol, source IP address, source port, destination IP address, destination port) corresponding to that packet. In other words, each packet deterministically maps to a bucket based on its attributes, and each node is configured (via a process called convergence) to handle only a subset of the available set of buckets.
Thus, each incoming packet from the network clients is received by each node, and each node independently figures out (hashes) whether that packet maps to a bucket that the node owns as a result of the most recent convergence. If so, that node accepts and processes the packet, otherwise it drops the packet, knowing that the packet will instead be accepted by a different node, specifically the node that was last assigned the bucket. In this manner, once the convergence process is complete and buckets are distributed, a node can independently decide whether to accept each incoming packet without needing to query other nodes.
If the cluster configuration changes (for instance, nodes are added or removed) then the convergence process runs again and buckets are redistributed among nodes. In the event that a bucket associated with a connection has moved following the convergence, current technology ensures that any previously established TCP connection continues to be processed by the same node, even if it no longer owns the bucket.
However, a new TCP connection from an existing client is accepted by whichever node currently owns the associated bucket. This is a problem for some applications and services, which require that the same node handle all connections from the same client, regardless of cluster configuration changes.